package com.zjsru.oneDay202209;

/**
 * @Author: likew
 * @Date: 2022/9/15 灯泡开关 Ⅱ 开关 1 ：反转当前所有灯的状态（即开变为关，关变为开） 开关 2 ：反转编号为偶数的灯的状态（即 2, 4, ...） 开关 3 ：反转编号为奇数的灯的状态（即 1, 3, ...）
 * 开关 4 ：反转编号为 j = 3k + 1 的灯的状态，其中 k = 0, 1, 2, ...（即 1, 4, 7, 10, ...）
 * <p>
 * 输入：n = 1, presses = 1 输出：2 解释：状态可以是： - 按压开关 1 ，[关] - 按压开关 2 ，[开]
 */
public class FlipLights {
    
    /**
     * 当 k = 0 时，无论 nn 为何值，都只有起始（全 1）一种状态；
     * 当 k > 0 时，根据 nn 进一步分情况讨论：
     * 当 n = 1 时，若 kk 为满足「k > 0」的最小值 1 时，能够取满「1/0」两种情况，而其余更大 k 值情况能够使用操作无效化（不影响灯的状态）；
     * 当 n = 2 时，若 k = 1k=1，能够取得「00/10/01」三种状态，当 k = 2k=2 时，能够取满「11/10/01/00」四种状态，其余更大 kk 可以通过前 k - 1 步归结到任一状态，再通过最后一次的操作 1 归结到任意状态；
     * 当 n = 3 时，若 k = 1k=1 时，对应 4 种操作可取得 4 种方案；当 k = 2 时，可取得 7 种状态；而当 k = 3 时可取满 2^3 = 8种状态，更大的 kk 值可通过同样的方式归结到取满的 8种状态。
     * 当 n > 3n>3 时，根据四类操作可知，灯泡每 6 组一循环（对应序列 k + 1、2k + 2、2k + 1 和 3k + 1），即只需考虑 n <= 6 的情况，而 n = 4、n = 5 和 n = 6 时，后引入的灯泡状态均不会产生新的组合（即新引入的灯泡状态由前三个灯泡的状态所唯一确定），因此均可归纳到 n = 3 的情况。
     *
     *
     * */
    public int flipLights(int n, int presses) {
        if (presses == 0) {
            return 1;
        }
        if (n == 1) {
            return 2;
        } else if (n == 2) {
            return presses == 1 ? 3 : 4;
        } else {
            return presses == 1 ? 4 : presses == 2 ? 7 : 8;
        }
    }
    
    public static void main(String[] args) {
        FlipLights flipLights = new FlipLights();
        int n = 1;
        int presses = 1;
        System.out.println(flipLights.flipLights(n, presses));
    }
}
